/***************************************************************
 * Copyright(C) 2024, HTDisplay. All Rights Reserved
 *
 * This file is part of the HtDisplaySDK Project.
 *
 * @file    :  GpioFactory.h
 *
 * @brief   :  GPIO的工厂类
 *
 * @author  :  郑满乐
 *
 * @date    :  2024-11-19
 ***************************************************************/

#ifndef GPIOFACTORY_H
#define GPIOFACTORY_H

#include "BasicGpio.h"
#include "GpioController.h"
#include <string>

/**
 * @enum GpioChannel
 * @brief GPIO通路枚举.
 */
/*enum  GpioChannel {
    DI_CHANNEL_NUMBER_00,   //用于创建第00路IN对象
    DI_CHANNEL_NUMBER_01,   //用于创建第01路IN对象
    DI_CHANNEL_NUMBER_02,   //用于创建第02路IN对象
    DI_CHANNEL_NUMBER_03,   //用于创建第03路IN对象
    DI_CHANNEL_NUMBER_04,   //用于创建第04路IN对象
    DI_CHANNEL_NUMBER_05,   //用于创建第05路IN对象
    DI_CHANNEL_NUMBER_06,   //用于创建第06路IN对象
    DI_CHANNEL_NUMBER_07,   //用于创建第07路IN对象

    DI_CHANNEL_NUMBER_08,   //用于创建第08路IN对象
    DI_CHANNEL_NUMBER_09,   //用于创建第09路IN对象
    DI_CHANNEL_NUMBER_10,   //用于创建第10路IN对象
    DI_CHANNEL_NUMBER_11,   //用于创建第11路IN对象
    DI_CHANNEL_NUMBER_12,   //用于创建第12路IN对象
    DI_CHANNEL_NUMBER_13,   //用于创建第13路IN对象
    DI_CHANNEL_NUMBER_14,   //用于创建第14路IN对象
    DI_CHANNEL_NUMBER_15,   //用于创建第15路IN对象

    DI_CHANNEL_NUMBER_16,   //用于创建第16路IN对象
    DI_CHANNEL_NUMBER_17,   //用于创建第17路IN对象
    DI_CHANNEL_NUMBER_18,   //用于创建第18路IN对象
    DI_CHANNEL_NUMBER_19,   //用于创建第19路IN对象
    DI_CHANNEL_NUMBER_20,   //用于创建第20路IN对象
    DI_CHANNEL_NUMBER_21,   //用于创建第21路IN对象
    DI_CHANNEL_NUMBER_22,   //用于创建第22路IN对象
    DI_CHANNEL_NUMBER_23,   //用于创建第23路IN对象
    DI_CHANNEL_NUMBER_24,   //用于创建第24路IN对象

    DO_CHANNEL_NUMBER_00,   //用于创建第00路OUT对象
    DO_CHANNEL_NUMBER_01,   //用于创建第01路OUT对象
    DO_CHANNEL_NUMBER_02,   //用于创建第02路OUT对象
    DO_CHANNEL_NUMBER_03,   //用于创建第03路OUT对象
    DO_CHANNEL_NUMBER_04,   //用于创建第04路OUT对象
    DO_CHANNEL_NUMBER_05,   //用于创建第05路OUT对象

    DO_CHANNEL_NUMBER_06,   //用于创建第06路OUT对象
    DO_CHANNEL_NUMBER_07,   //用于创建第07路OUT对象
    DO_CHANNEL_NUMBER_08,   //用于创建第08路OUT对象
    DO_CHANNEL_NUMBER_09,   //用于创建第09路OUT对象
    DO_CHANNEL_NUMBER_10,   //用于创建第10路OUT对象
    DO_CHANNEL_NUMBER_11    //用于创建第11路OUT对象
};*/

enum  DIChannel {
    DI_CHANNEL_NUMBER_00 = 0,   //用于创建第00路IN对象
    DI_CHANNEL_NUMBER_01,   //用于创建第01路IN对象
    DI_CHANNEL_NUMBER_02,   //用于创建第02路IN对象
    DI_CHANNEL_NUMBER_03,   //用于创建第03路IN对象
    DI_CHANNEL_NUMBER_04,   //用于创建第04路IN对象
    DI_CHANNEL_NUMBER_05,   //用于创建第05路IN对象
    DI_CHANNEL_NUMBER_06,   //用于创建第06路IN对象
    DI_CHANNEL_NUMBER_07,   //用于创建第07路IN对象

    DI_CHANNEL_NUMBER_08,   //用于创建第08路IN对象
    DI_CHANNEL_NUMBER_09,   //用于创建第09路IN对象
    DI_CHANNEL_NUMBER_10,   //用于创建第10路IN对象
    DI_CHANNEL_NUMBER_11,   //用于创建第11路IN对象
    DI_CHANNEL_NUMBER_12,   //用于创建第12路IN对象
    DI_CHANNEL_NUMBER_13,   //用于创建第13路IN对象
    DI_CHANNEL_NUMBER_14,   //用于创建第14路IN对象
    DI_CHANNEL_NUMBER_15,   //用于创建第15路IN对象

    DI_CHANNEL_NUMBER_16,   //用于创建第16路IN对象
    DI_CHANNEL_NUMBER_17,   //用于创建第17路IN对象
    DI_CHANNEL_NUMBER_18,   //用于创建第18路IN对象
    DI_CHANNEL_NUMBER_19,   //用于创建第19路IN对象
    DI_CHANNEL_NUMBER_20,   //用于创建第20路IN对象
    DI_CHANNEL_NUMBER_21,   //用于创建第21路IN对象
    DI_CHANNEL_NUMBER_22,   //用于创建第22路IN对象
    DI_CHANNEL_NUMBER_23,   //用于创建第23路IN对象
    DI_CHANNEL_NUMBER_24,   //用于创建第24路IN对象
};

enum  DOChannel {
    DO_CHANNEL_NUMBER_00 = 0,   //用于创建第00路OUT对象
    DO_CHANNEL_NUMBER_01,   //用于创建第01路OUT对象
    DO_CHANNEL_NUMBER_02,   //用于创建第02路OUT对象
    DO_CHANNEL_NUMBER_03,   //用于创建第03路OUT对象
    DO_CHANNEL_NUMBER_04,   //用于创建第04路OUT对象
    DO_CHANNEL_NUMBER_05,   //用于创建第05路OUT对象

    DO_CHANNEL_NUMBER_06,   //用于创建第06路OUT对象
    DO_CHANNEL_NUMBER_07,   //用于创建第07路OUT对象
    DO_CHANNEL_NUMBER_08,   //用于创建第08路OUT对象
    DO_CHANNEL_NUMBER_09,   //用于创建第09路OUT对象
    DO_CHANNEL_NUMBER_10,   //用于创建第10路OUT对象
    DO_CHANNEL_NUMBER_11    //用于创建第11路OUT对象
};

/**
 * @class SerialFactory
 * @brief GPIO工厂类.
 */
class  GpioFactory
{
private:
    GpioFactory();

public:
    /**
     * @brief 用于创建 BasicGpio 对象.
     * @param channel 指定创建GPIO通路.
     * @return GPIO对象.
     */
     static BasicGpio* createGpio(DIChannel channel);

     /**
      * @brief 用于创建 BasicGpio 对象.
      * @param number GPIO编号.
      *        direction GPIO方向 in 或 out
      * @return GPIO对象.
      */
      static BasicGpio* createGpio(int number, std::string direction);
      static BasicGpio* createDI(DIChannel channel);
      static BasicGpio* createDO(DOChannel channel);
};

#endif // GPIOFACTORY_H
